#ifndef __PlayState_h__
#define __PlayState_h__

#include <list>
#include <sstream>
#include <Ogre.h>
#include <OIS/OIS.h>

#include <GameState.h>
#include <EndGameState.h>
#include <IntroState.h>

enum Direction {left, downright, right, downleft};

class PlayState: public Ogre::Singleton<PlayState>, public GameState
{
  public:
    void enter();
    void exit();
    void pause();
    void resume();

    void keyPressed(const OIS::KeyEvent&);
    void keyReleased(const OIS::KeyEvent&);

    void mouseMoved(const OIS::MouseEvent&);
    void mousePressed(const OIS::MouseEvent&, OIS::MouseButtonID);
    void mouseReleased(const OIS::MouseEvent&, OIS::MouseButtonID);

    bool frameStarted(const Ogre::FrameEvent&);
    bool frameEnded(const Ogre::FrameEvent&);

    // Heredados de Ogre::Singleton.
    static PlayState& getSingleton();
    static PlayState* getSingletonPtr();

    void startGame();
    void moveDefender(const Ogre::Real);
    void moveInvaders(const Ogre::Real);
    void shotDefender(const Ogre::Real);
    void shotInvaders(const Ogre::Real);
    void gameOver(const EndType);

  protected:
    Ogre::Root* _root;
    Ogre::SceneManager* _sceneMgr;
    Ogre::Viewport* _viewport;
    Ogre::Camera* _camera;
    Ogre::OverlayManager* _overlayMgr;
    Ogre::RenderWindow* _win;

    Ogre::SceneNode* _defender; // Nodo de la nave
    Ogre::SceneNode *_defShot;  // Nodo del disparo de la nave
    Ogre::Real _turn;           // Ultima direccion de giro de la nave

    Ogre::SceneNode *_invaders; // Nodo padre de todas las naves enemigas
    Ogre::SceneNode *_invShot;  // Nodo del disparo del enemigo
    Ogre::Real _cont;           // Contador para controlar el movimiento del enemigo
    Direction _dir;             // Enumeración para controlar la direccion de movimiento
    bool _shipDirL;             // Variables para controlar el movimiento de la nave
    bool _shipDirR;
    bool _shipShot;             // Variable para saber si la nave ha disparado.
    unsigned int _counter;      // Contador de invasores.
    unsigned int _score;        // Puntuación.

    bool _endGame;              // Variable para ver si ha terminadl el juego.
    bool _exitGame;
};

#endif
